These are models to evaluate the relationship between average population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level.
# null model
m0 = lmer(avlambda ~ (1|Binomial), data = df)
m1 = lmer(avlambda ~ Class + (1|Binomial), data = df)
m2 = lmer(avlambda ~ Class + System + (1|Binomial), data = df)
m3 = lmer(avlambda ~ System + (1|Binomial), data = df)
# adding traits
# body size only
# class should be in each model because body size is normalised within classes
m4 = lmer(avlambda ~ log10(BodySize) + Class + (1|Binomial), data = df)
m5 = lmer(avlambda ~ log10(BodySize) + Class + System + (1|Binomial), data = df)
m6 = lmer(avlambda ~ Class*log10(BodySize) + (1|Binomial), data = df)
m7 = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial), data = df)
# trophic level only
m8 = lmer(avlambda ~ TrophicLevel + (1|Binomial), data = df)
m9 = lmer(avlambda ~ TrophicLevel + Class + (1|Binomial), data = df)
m10 = lmer(avlambda ~ TrophicLevel + System + (1|Binomial), data = df)
m11 = lmer(avlambda ~ Class*TrophicLevel + (1|Binomial), data = df)
m12 = lmer(avlambda ~ System*TrophicLevel + (1|Binomial), data = df)
# lifespan only
m13 = lmer(avlambda ~ LifeSpan + (1|Binomial), data = df)
m14 = lmer(avlambda ~ LifeSpan + Class + (1|Binomial), data = df)
m15 = lmer(avlambda ~ LifeSpan + System + (1|Binomial), data = df)
m16 = lmer(avlambda ~ Class*LifeSpan + (1|Binomial), data = df)
m17 = lmer(avlambda ~ System*LifeSpan + (1|Binomial), data = df)
# all three traits
m18 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + Class + (1|Binomial), data = df)
m19 = lmer(avlambda ~ log10(BodySize) + LifeSpan + Class + (1|Binomial), data = df)
m20 = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial), data = df)
m21 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + Class + (1|Binomial), data = df)
If we compare these models, their performance looks like…
compare_performance(m0, m1, m2, m3, # no traits
m4, m5, m6, m7, # body size
m8, m9, m10, m11, m12, # trophic level
m13, m14, m15, m16, m17, # lifespan
m18, m19, m20, m21, # variations of 2 or 3 traits
rank = TRUE) %>% head() %>%
kableExtra::kable() %>% kableExtra::kable_styling("striped")
| Name | Model | AIC | BIC | R2_conditional | R2_marginal | ICC | RMSE | Sigma | Performance_Score |
|---|---|---|---|---|---|---|---|---|---|
| m12 | lmerMod | -2651.267 | -2592.219 | 0.0413731 | 0.0094439 | 0.0322336 | 0.1427925 | 0.1446303 | 0.8379973 |
| m3 | lmerMod | -2666.747 | -2637.224 | 0.0349035 | 0.0007474 | 0.0341816 | 0.1431983 | 0.1450023 | 0.5745691 |
| m10 | lmerMod | -2649.471 | -2608.138 | 0.0354866 | 0.0010076 | 0.0345137 | 0.1431630 | 0.1450241 | 0.5392917 |
| m0 | lmerMod | -2684.811 | -2667.097 | 0.0325788 | 0.0000000 | 0.0325788 | 0.1433753 | 0.1450729 | 0.5164743 |
| m17 | lmerMod | -2623.293 | -2576.055 | 0.0365969 | 0.0033761 | 0.0333334 | 0.1431466 | 0.1449834 | 0.5110802 |
| m15 | lmerMod | -2651.300 | -2615.871 | 0.0347394 | 0.0021111 | 0.0326974 | 0.1432675 | 0.1450350 | 0.5056986 |
Let’s look at the top models!
avlambda ~ System*TrophicLevel + (1|Binomial)#check_model(m12) this is giving an error now?
#plot_model(m12, type="pred")
These are models to evaluate the relationship between average population change and body size, trophic level, and lifespan traits, while accounting for differences in System, and including a random effect by Binomial because the trait data was collected at the species level. The Class variable is not included in these models, because the data is subset within the Mammals class.
df_taxon = filter(df_join, Class == "Mammals") %>% na.omit()
# null model
m0 = lmer(avlambda ~ (1|Binomial), data = df_taxon)
m1 = lmer(avlambda ~ System + (1|Binomial), data = df_taxon)
# adding traits
# body size only
# class should be in each model because body size is normalised within classes
m2 = lmer(avlambda ~ log10(BodySize) + (1|Binomial), data = df_taxon)
m3 = lmer(avlambda ~ log10(BodySize) + System + (1|Binomial), data = df_taxon)
m4 = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial), data = df_taxon)
# trophic level only
m5 = lmer(avlambda ~ TrophicLevel + (1|Binomial), data = df_taxon)
m6 = lmer(avlambda ~ TrophicLevel + System + (1|Binomial), data = df_taxon)
m7 = lmer(avlambda ~ System*TrophicLevel + (1|Binomial), data = df_taxon)
# lifespan only
m8 = lmer(avlambda ~ LifeSpan + (1|Binomial), data = df_taxon)
m9 = lmer(avlambda ~ LifeSpan + System + (1|Binomial), data = df_taxon)
m10 = lmer(avlambda ~ System*LifeSpan + (1|Binomial), data = df_taxon)
# all three traits
m11 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial), data = df_taxon)
m12 = lmer(avlambda ~ log10(BodySize) + LifeSpan + (1|Binomial), data = df_taxon)
m13 = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial), data = df_taxon)
m14 = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial), data = df_taxon)
compare_performance(m0, m1, # no traits
m2, m3, m4, # body size
m5, m6, m7, # trophic
m8, m9, m10, # lifespan
m11, m12, m13, m14, # combos of traits
rank = TRUE) %>% head() %>%
kableExtra::kable() %>% kableExtra::kable_styling("striped")
| Name | Model | AIC | BIC | R2_conditional | R2_marginal | ICC | RMSE | Sigma | Performance_Score |
|---|---|---|---|---|---|---|---|---|---|
| m5 | lmerMod | -510.2379 | -489.1949 | 0.1623360 | 0.0053920 | 0.1577948 | 0.1293784 | 0.1341837 | 0.7524747 |
| m13 | lmerMod | -494.5324 | -469.2809 | 0.1644064 | 0.0055093 | 0.1597774 | 0.1293237 | 0.1342535 | 0.6720469 |
| m6 | lmerMod | -500.1311 | -470.6709 | 0.1624907 | 0.0145367 | 0.1501365 | 0.1295234 | 0.1343726 | 0.6483838 |
| m7 | lmerMod | -496.9368 | -463.2681 | 0.1643309 | 0.0151153 | 0.1515056 | 0.1294144 | 0.1343950 | 0.6466554 |
| m0 | lmerMod | -524.3005 | -511.6748 | 0.1488905 | 0.0000000 | 0.1488905 | 0.1298620 | 0.1343833 | 0.6276346 |
| m8 | lmerMod | -508.3950 | -491.5606 | 0.1522503 | 0.0001447 | 0.1521276 | 0.1297337 | 0.1344028 | 0.5745688 |
The two best models are two of the null options (m0 and m1). However, let’s take a look at the best model with traits included:
avlambda ~ TrophicLevel + (1|Binomial)#check_model(m5)
plot_model(m5, type="pred")
plot_model(m5, type="re")
## Warning in checkMatrixPackageVersion(): Package version inconsistency detected.
## TMB was built with Matrix version 1.2.18
## Current Matrix version is 1.3.2
## Please re-install 'TMB' from source using install.packages('TMB', type = 'source') or ask CRAN for a binary version of 'TMB' matching CRAN's 'Matrix' package
avlambda ~ TrophicLevel + LifeSpan + (1|Binomial)#check_model(m13)
plot_model(m13, type="pred")
plot_model(m13, type="re")
bird_df = filter(df, Class == "Birds")
# check missing values
vis_miss(bird_df)
# ensure complete cases for all traits
# helps with comparing AIC values
bird_tidy <- bird_df[complete.cases(bird_df), ]
# check missing values
vis_miss(bird_tidy)
# null model
m0_b = lmer(avlambda ~ (1|Binomial), data = bird_tidy)
m1_b = lmer(avlambda ~ System + (1|Binomial), data = bird_tidy)
# adding traits
# body size only
# class should be in each model because body size is normalised within classes
m2_b = lmer(avlambda ~ log10(BodySize) + (1|Binomial), data = bird_tidy)
m3_b = lmer(avlambda ~ log10(BodySize) + System + (1|Binomial), data = bird_tidy)
m4_b = lmer(avlambda ~ System*log10(BodySize) + (1|Binomial), data = bird_tidy)
# trophic level only
m5_b = lmer(avlambda ~ TrophicLevel + (1|Binomial), data = bird_tidy)
m6_b = lmer(avlambda ~ TrophicLevel + System + (1|Binomial), data = bird_tidy)
m7_b = lmer(avlambda ~ System*TrophicLevel + (1|Binomial), data = bird_tidy)
# lifespan only
m8_b = lmer(avlambda ~ LifeSpan + (1|Binomial), data = bird_tidy)
m9_b = lmer(avlambda ~ LifeSpan + System + (1|Binomial), data = bird_tidy)
m10_b = lmer(avlambda ~ System*LifeSpan + (1|Binomial), data = bird_tidy)
# all three traits
m11_b = lmer(avlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial), data = bird_tidy)
m12_b = lmer(avlambda ~ log10(BodySize) + LifeSpan + (1|Binomial), data = bird_tidy)
m13_b = lmer(avlambda ~ TrophicLevel + LifeSpan + (1|Binomial), data = bird_tidy)
m14_b = lmer(avlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial), data = bird_tidy)
compare_performance(m0_b, m1_b, m2_b, m3_b, # no traits
m4_b, m5_b, m6_b, m7_b, # body size
m8_b, m9_b, m10_b, m11_b, m12_b, # trophic level
m13_b, m14_b, # variations of 2 or 3 traits
rank = TRUE) %>%
kableExtra::kable() %>% kableExtra::kable_styling("striped")
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Random effect variances not available. Returned R2 does not account for random effects.
## Warning: Following indices with missing values are not used for ranking:
## R2_conditional
| Name | Model | AIC | BIC | R2_conditional | R2_marginal | RMSE | Sigma | Performance_Score |
|---|---|---|---|---|---|---|---|---|
| m7_b | lmerMod | -721.6308 | -683.3120 | NA | 0.1120632 | 0.0755483 | 0.0764504 | 0.8108415 |
| m0_b | lmerMod | -737.5092 | -726.0135 | NA | 0.0000000 | 0.0802684 | 0.0803864 | 0.4107035 |
| m5_b | lmerMod | -725.5454 | -706.3860 | NA | 0.0175705 | 0.0795560 | 0.0799083 | 0.3893725 |
| m1_b | lmerMod | -723.9732 | -704.8138 | NA | 0.0124516 | 0.0797642 | 0.0801174 | 0.3503864 |
| m6_b | lmerMod | -711.7819 | -684.9587 | NA | 0.0290335 | 0.0790809 | 0.0796672 | 0.3231247 |
| m2_b | lmerMod | -727.0366 | -711.7091 | NA | 0.0002035 | 0.0802602 | 0.0804966 | 0.3218397 |
| m11_b | lmerMod | -715.1653 | -692.1740 | NA | 0.0179796 | 0.0795372 | 0.0800078 | 0.3024846 |
| m8_b | lmerMod | -721.9455 | -706.6179 | NA | 0.0003647 | 0.0802537 | 0.0804901 | 0.2871895 |
| m13_b | lmerMod | -710.1186 | -687.1273 | NA | 0.0182940 | 0.0795243 | 0.0799949 | 0.2689950 |
| m3_b | lmerMod | -713.6950 | -690.7037 | NA | 0.0124156 | 0.0797642 | 0.0802361 | 0.2616961 |
| m9_b | lmerMod | -708.4588 | -685.4675 | NA | 0.0124867 | 0.0797613 | 0.0802332 | 0.2255476 |
| m12_b | lmerMod | -711.9907 | -692.8313 | NA | 0.0003681 | 0.0802536 | 0.0806089 | 0.2008309 |
| m14_b | lmerMod | -700.1714 | -673.3483 | NA | 0.0182561 | 0.0795237 | 0.0801132 | 0.1826588 |
| m10_b | lmerMod | -688.2070 | -657.5520 | NA | 0.0320444 | 0.0789530 | 0.0796569 | 0.1587143 |
| m4_b | lmerMod | -698.7430 | -668.0879 | NA | 0.0137269 | 0.0797074 | 0.0804181 | 0.1309672 |
These are models to evaluate the relationship between summed population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level. Each model includes time series length to account for differences in summed lambdas in shorter vs. longer time series.
# null model
m0 = lmer(sumlambda ~ (1|Binomial) + tslength, data = df)
m1 = lmer(sumlambda ~ Class + (1|Binomial) + tslength, data = df)
m2 = lmer(sumlambda ~ Class + System + (1|Binomial) + tslength, data = df)
m3 = lmer(sumlambda ~ System + (1|Binomial) + tslength, data = df)
# adding traits
# body size only
# class should be in each model because body size is normalised within classes
m4 = lmer(sumlambda ~ log10(BodySize) + Class + (1|Binomial) + tslength, data = df)
m5 = lmer(sumlambda ~ log10(BodySize) + Class + System + (1|Binomial) + tslength, data = df)
m6 = lmer(sumlambda ~ Class*log10(BodySize) + (1|Binomial) + tslength, data = df)
m7 = lmer(sumlambda ~ System*log10(BodySize) + (1|Binomial) + tslength, data = df)
# trophic level only
m8 = lmer(sumlambda ~ TrophicLevel + (1|Binomial) + tslength, data = df)
m9 = lmer(sumlambda ~ TrophicLevel + Class + (1|Binomial) + tslength, data = df)
m10 = lmer(sumlambda ~ TrophicLevel + System + (1|Binomial) + tslength, data = df)
m11 = lmer(sumlambda ~ Class*TrophicLevel + (1|Binomial) + tslength, data = df)
m12 = lmer(sumlambda ~ System*TrophicLevel + (1|Binomial) + tslength, data = df)
# lifespan only
m13 = lmer(sumlambda ~ LifeSpan + (1|Binomial) + tslength, data = df)
m14 = lmer(sumlambda ~ LifeSpan + Class + (1|Binomial) + tslength, data = df)
m15 = lmer(sumlambda ~ LifeSpan + System + (1|Binomial) + tslength, data = df)
m16 = lmer(sumlambda ~ Class*LifeSpan + (1|Binomial) + tslength, data = df)
m17 = lmer(sumlambda ~ System*LifeSpan + (1|Binomial) + tslength, data = df)
# all three traits
m18 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + Class + (1|Binomial) + tslength, data = df)
m19 = lmer(sumlambda ~ log10(BodySize) + LifeSpan + Class + (1|Binomial) + tslength, data = df)
m20 = lmer(sumlambda ~ TrophicLevel + LifeSpan + (1|Binomial) + tslength, data = df)
m21 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + Class + (1|Binomial) + tslength, data = df)
compare_performance(m0, m1, m2, m3, # no traits
m4, m5, m6, m7, # body size
m8, m9, m10, m11, m12, # trophic level
m13, m14, m15, m16, m17, # lifespan
m18, m19, m20, m21, # variations of 2 or 3 traits
rank = TRUE) %>% head() %>%
kableExtra::kable() %>% kableExtra::kable_styling("striped")
| Name | Model | AIC | BIC | R2_conditional | R2_marginal | ICC | RMSE | Sigma | Performance_Score |
|---|---|---|---|---|---|---|---|---|---|
| m6 | lmerMod | 6085.413 | 6162.174 | 0.0777289 | 0.0187221 | 0.0601326 | 0.7041076 | 0.7184480 | 0.6850224 |
| m16 | lmerMod | 6125.509 | 6202.270 | 0.0777050 | 0.0138256 | 0.0647750 | 0.7035225 | 0.7186127 | 0.6342115 |
| m7 | lmerMod | 6085.756 | 6138.899 | 0.0737833 | 0.0113476 | 0.0631524 | 0.7046896 | 0.7191119 | 0.5812964 |
| m2 | lmerMod | 6083.183 | 6142.230 | 0.0737357 | 0.0118943 | 0.0625858 | 0.7047351 | 0.7191884 | 0.5646301 |
| m5 | lmerMod | 6090.942 | 6155.894 | 0.0742245 | 0.0117707 | 0.0631977 | 0.7045316 | 0.7191726 | 0.5636350 |
| m3 | lmerMod | 6075.776 | 6111.204 | 0.0708416 | 0.0062851 | 0.0649648 | 0.7053252 | 0.7197463 | 0.5125315 |
sumlambda ~ Class*log10(BodySize) + (1|Binomial) + tslength#check_model(m6)
plot_model(m6, type="pred")
## Warning: Removed 1 row(s) containing missing values (geom_path).
sumlambda ~ Class*LifeSpan + (1|Binomial) + tslength#check_model(m16)
plot_model(m16, type="pred")
These are models to evaluate the relationship between summed population change and body size, trophic level, and lifespan traits, while accounting for differences in System and Class, and including a random effect by Binomial because the trait data was collected at the species level. Each model includes time series length to account for differences in summed lambdas in shorter vs. longer time series.
# null model
m0 = lmer(sumlambda ~ (1|Binomial), data = df_taxon)
m1 = lmer(sumlambda ~ System + (1|Binomial), data = df_taxon)
# adding traits
# body size only
# class should be in each model because body size is normalised within classes
m2 = lmer(sumlambda ~ log10(BodySize) + (1|Binomial) + tslength, data = df_taxon)
m3 = lmer(sumlambda ~ log10(BodySize) + System + (1|Binomial) + tslength, data = df_taxon)
m4 = lmer(sumlambda ~ System*log10(BodySize) + (1|Binomial) + tslength, data = df_taxon)
# trophic level only
m5 = lmer(sumlambda ~ TrophicLevel + (1|Binomial) + tslength, data = df_taxon)
m6 = lmer(sumlambda ~ TrophicLevel + System + (1|Binomial) + tslength, data = df_taxon)
m7 = lmer(sumlambda ~ System*TrophicLevel + (1|Binomial) + tslength, data = df_taxon)
# lifespan only
m8 = lmer(sumlambda ~ LifeSpan + (1|Binomial) + tslength, data = df_taxon)
m9 = lmer(sumlambda ~ LifeSpan + System + (1|Binomial) + tslength, data = df_taxon)
m10 = lmer(sumlambda ~ System*LifeSpan + (1|Binomial) + tslength, data = df_taxon)
# all three traits
m11 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + (1|Binomial) + tslength, data = df_taxon)
m12 = lmer(sumlambda ~ log10(BodySize) + LifeSpan + (1|Binomial) + tslength, data = df_taxon)
m13 = lmer(sumlambda ~ TrophicLevel + LifeSpan + (1|Binomial) + tslength, data = df_taxon)
m14 = lmer(sumlambda ~ log10(BodySize) + TrophicLevel + LifeSpan + (1|Binomial) + tslength, data = df_taxon)
compare_performance(m0, m1, # no traits
m2, m3, m4, # body size
m5, m6, m7, # trophic
m8, m9, m10, # lifespan
m11, m12, m13, m14, # combos of traits
rank = TRUE) %>% head() %>%
kableExtra::kable() %>% kableExtra::kable_styling("striped")
| Name | Model | AIC | BIC | R2_conditional | R2_marginal | ICC | RMSE | Sigma | Performance_Score |
|---|---|---|---|---|---|---|---|---|---|
| m5 | lmerMod | 784.1246 | 809.3762 | 0.2109302 | 0.0288631 | 0.1874783 | 0.4684271 | 0.4881286 | 0.6225298 |
| m0 | lmerMod | 775.5362 | 788.1620 | 0.2197032 | 0.0000000 | 0.2197032 | 0.4690844 | 0.4897047 | 0.6204866 |
| m6 | lmerMod | 789.8921 | 823.5608 | 0.2159069 | 0.0347315 | 0.1876943 | 0.4681072 | 0.4884065 | 0.6166900 |
| m7 | lmerMod | 790.9240 | 828.8013 | 0.2178949 | 0.0345982 | 0.1898657 | 0.4678565 | 0.4886512 | 0.6163295 |
| m1 | lmerMod | 780.7965 | 801.8394 | 0.2234830 | 0.0075667 | 0.2175626 | 0.4688007 | 0.4898477 | 0.6156548 |
| m13 | lmerMod | 797.0486 | 826.5087 | 0.2138352 | 0.0284946 | 0.1907767 | 0.4679915 | 0.4881880 | 0.5773345 |
sumlambda ~ TrophicLevel + (1|Binomial) + tslength#check_model(m5)
plot_model(m5, type="pred")